/* eslint no-param-reassign:off, camelcase:off,no-console:off */
import { Downloader, Parser } from 'svga-web';

/**
 * @function playSvga 播放svga动画
 * @param svgaPlayer canvas对象
 * @param svgaUrl 文件url
 * @param option 配置项
 * @param {function} option._failCallback 下载失败的回调函数
 * @param {function} option._mountBeforeCallback 挂载在svgaPlayer之前的回调函数
 * @param {function} option._startBeforeCallback 开始之前的回调函数
 * @param {function} option._endCallback 结束后的回调函数
 * @param {boolean} option.isSvgaData SVGA数据则为true URL模式则为false
 * @param {string} option.svgaId svga的唯一标识
 * @param {number} option.loop 循环次数 0（无限循环）默认值 1
 * @param db 本地数据库
 * @returns {Boolean} 播放失败返回假
 */
export async function playSvga(svgaPlayer: any, svgaUrl: string, option: any, db: any) {
    const _option = {
        _mountBeforeCallback: undefined,
        _startBeforeCallback: undefined,
        _endCallback: undefined,
        _failCallback: undefined,
        isSvgaData: false,
        svgaId: 0,
        loop: 1,
        ...option,
    };
    let downloader: any;
    let parser: any;

    const onFailed = () => {
        if (_option._failCallback) {
            _option._failCallback();
        }
        return false;
    };

    // 开始之前执行的函数
    if (_option._mountBeforeCallback) {
        _option._mountBeforeCallback();
    }

    // 加载数据 若加载失败，则触发失败回调
    if (_option.isSvgaData) {
        svgaPlayer.mount(svgaUrl);
        await db.insert(_option.svgaId, svgaUrl);
    } else {
        let _data = await db.find(_option.svgaId);
        if (!_data) {
            try {
                // 下载数据
                downloader = new Downloader();
                const fileData = await downloader.get(svgaUrl);
                parser = new Parser();
                _data = await parser.do(fileData);
            } catch (error) {
                onFailed();
            }
        }
        await svgaPlayer.mount(_data);
    }
    // 开始播放svga
    if (_option._startBeforeCallback) {
        _option._startBeforeCallback();
    }
    svgaPlayer.set({ loop: _option.loop });
    svgaPlayer.start();
    svgaPlayer
        .$on('end', () => {
            svgaPlayer.clear(); // 清除画布
            if (_option._endCallback) {
                _option._endCallback();
            }
        })
        .$on('stop', () => {
            svgaPlayer.clear(); // 清除画布
            if (_option._endCallback) {
                _option._endCallback();
            }
        });
}
